/**
 * 
 */
package interfaz;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Toolkit;

import javax.swing.JDialog;
import javax.swing.JOptionPane;
import javax.swing.JTabbedPane;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.WindowConstants;
import javax.swing.JPanel;
import javax.swing.JLabel;
import java.awt.Rectangle;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.ImageIcon;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultStyledDocument;
import javax.swing.text.Style;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyleContext;

import excepciones.ContenidoException;
import excepciones.DataStructureException;

import logica.analizador.DocumentoJerarquicoEnlazado;
import logica.common.NodoVinculo;
import resources.NTree.Vinculo;

/**
 * @author renzo
 *
 */
public class Ayuda extends JDialog implements ActionListener,KeyListener,MouseListener{

	private static final long serialVersionUID = 1L;
	private JTabbedPane jTabbedPane = null;
	private JPanel jPanel = null;
	private JLabel jLabel = null;
	private JLabel jLabel1 = null;
	private JLabel jLabel2 = null;
	private JLabel jLabel3 = null;
	private JLabel jLabel4 = null;
	private JLabel jLabel5 = null;
	private JPanel jPanel1 = null;
	private JButton jButton = null;
	private JButton jButton1 = null;
	private JScrollPane jScrollPane = null;
	private JTextPane jTextPane = null;
	private String ayuda;
	private Vector<Vinculo> vinculos;
	private Vector<Object> datos;
	private int posicion=0;
	private Vector<String> seleccionado=new Vector<String>();
	
	/**
	 * @param owner
	 */
	public Ayuda(Frame owner) {
		super(owner);
		initialize();
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.getAyuda();
		this.inicializar("");
		seleccionado.addElement("");
		this.setSize(587, 479);
		this.setResizable(false);
		this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
		double fil=dim.getWidth();
		double col=dim.getHeight();
		fil=(fil-587)/2;
		col=(col-479)/2;
		this.setLocation((int)fil, (int)col);
		this.setTitle("Ayuda en linea");
		this.setContentPane(getJTabbedPane());
		this.getJTextPane().setEditable(false);
		this.getJButton().setEnabled(false);
		this.getJButton1().setEnabled(false);
	}

	/**
	 * This method initializes jTabbedPane	
	 * 	
	 * @return javax.swing.JTabbedPane	
	 */
	private JTabbedPane getJTabbedPane() {
		if (jTabbedPane == null) {
			jTabbedPane = new JTabbedPane();
			jTabbedPane.addTab("Ayuda en linea", null, getJPanel1(), null);
			jTabbedPane.addTab("Acerca de", null, getJPanel(), null);
		}
		return jTabbedPane;
	}

	/**
	 * This method initializes jPanel	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getJPanel() {
		if (jPanel == null) {
			jLabel5 = new JLabel();
			jLabel5.setBounds(new Rectangle(224, 299, 202, 46));
			jLabel5.setFont(new Font("Dialog", Font.BOLD, 18));
			jLabel5.setText("Simonetto, Renzo");
			jLabel4 = new JLabel();
			jLabel4.setBounds(new Rectangle(224, 254, 172, 39));
			jLabel4.setFont(new Font("Dialog", Font.BOLD, 18));
			jLabel4.setText("Gallardo, Diego");
			jLabel3 = new JLabel();
			jLabel3.setBounds(new Rectangle(141, 230, 83, 15));
			jLabel3.setFont(new Font("Dialog", Font.BOLD, 18));
			jLabel3.setText("Autores:");
			jLabel2 = new JLabel();
			jLabel2.setBounds(new Rectangle(140, 158, 250, 37));
			jLabel2.setFont(new Font("Dialog", Font.BOLD, 18));
			jLabel2.setText("25 de febrero de 2009");
			jLabel1 = new JLabel();
			jLabel1.setBounds(new Rectangle(140, 128, 160, 30));
			jLabel1.setFont(new Font("Dialog", Font.BOLD, 18));
			jLabel1.setText("Version 0.91");
			jLabel = new JLabel();
			jLabel.setBounds(new Rectangle(134, 34, 285, 74));
			jLabel.setFont(new Font("Furat", Font.BOLD, 48));
			jLabel.setText("TP 3 - DIED");
			jPanel = new JPanel();
			jPanel.setLayout(null);
			jPanel.add(jLabel, null);
			jPanel.add(jLabel1, null);
			jPanel.add(jLabel2, null);
			jPanel.add(jLabel3, null);
			jPanel.add(jLabel4, null);
			jPanel.add(jLabel5, null);
		}
		return jPanel;
	}

	/**
	 * This method initializes jPanel1	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getJPanel1() {
		if (jPanel1 == null) {
			jPanel1 = new JPanel();
			jPanel1.setLayout(null);
			jPanel1.add(getJButton(), null);
			jPanel1.add(getJButton1(), null);
			jPanel1.add(getJScrollPane(), null);
		}
		return jPanel1;
	}

	/**
	 * This method initializes jButton	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getJButton() {
		if (jButton == null) {
			jButton = new JButton();
			jButton.setBounds(new Rectangle(309, 365, 42, 42));
			jButton.setIcon(new ImageIcon(getClass().getResource("/Icons/flecha der.png")));
			jButton.addActionListener(this);
			jButton.setActionCommand("siguiente");
		}
		return jButton;
	}

	/**
	 * This method initializes jButton1	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getJButton1() {
		if (jButton1 == null) {
			jButton1 = new JButton();
			jButton1.setBounds(new Rectangle(221, 365, 42, 42));
			jButton1.setIcon(new ImageIcon(getClass().getResource("/Icons/flecha izq.png")));
			jButton1.addActionListener(this);
			jButton1.setActionCommand("anterior");
		}
		return jButton1;
	}

	/**
	 * This method initializes jScrollPane	
	 * 	
	 * @return javax.swing.JScrollPane	
	 */
	private JScrollPane getJScrollPane() {
		if (jScrollPane == null) {
			jScrollPane = new JScrollPane();
			jScrollPane.setBounds(new Rectangle(4, 2, 566, 353));
			jScrollPane.setViewportView(getJTextPane());
		}
		return jScrollPane;
	}

	/**
	 * This method initializes jTextPane	
	 * 	
	 * @return javax.swing.JTextPane	
	 */
	private JTextPane getJTextPane() {
		if (jTextPane == null) {
			jTextPane = new JTextPane();
		}
		return jTextPane;
	}

	@SuppressWarnings("unchecked")
	@Override
	public void actionPerformed(ActionEvent arg0) {
		if(arg0.getActionCommand()=="anterior")
		{
			DocumentoJerarquicoEnlazado dJE1;
			try {
				dJE1 = new DocumentoJerarquicoEnlazado(ayuda);
				posicion--;
				datos= dJE1.getSeccion(seleccionado.elementAt(posicion-1));
				
				this.jTabbedPane=null;
				this.jPanel1=null;
				this.jScrollPane=null;
				this.jTextPane=null;
				
				this.inicializar(seleccionado.elementAt(posicion-1));
				
				this.setContentPane(getJTabbedPane());
				this.getJTextPane().setEditable(false);
				
				if(posicion==1)
				{
					this.getJButton1().setEnabled(false);
					this.getJButton().setEnabled(true);
				}
			} catch (ContenidoException e) {
				JOptionPane.showMessageDialog(this, "Texto con errores de sintaxis", "Atencion!", 2);
			} catch (DataStructureException e) {
				JOptionPane.showMessageDialog(this, "Texto con errores de sintaxis", "Atencion!", 2);
			}
			
		}
		if(arg0.getActionCommand()=="siguiente")
		{
			DocumentoJerarquicoEnlazado dJE1;
			try {
				dJE1 = new DocumentoJerarquicoEnlazado(ayuda);
				posicion++;
				datos= dJE1.getSeccion(seleccionado.elementAt(posicion-1));
				
				this.jTabbedPane=null;
				this.jPanel1=null;
				this.jScrollPane=null;
				this.jTextPane=null;
				
				this.inicializar(seleccionado.elementAt(posicion-1));
				
				this.setContentPane(getJTabbedPane());
				this.getJTextPane().setEditable(false);
				
				if(posicion==seleccionado.size())
				{
					this.getJButton().setEnabled(false);
					this.getJButton1().setEnabled(true);
				}

			} catch (ContenidoException e) {
				JOptionPane.showMessageDialog(this, "Texto con errores de sintaxis", "Atencion!", 2);
			} catch (DataStructureException e) {
				JOptionPane.showMessageDialog(this, "Texto con errores de sintaxis", "Atencion!", 2);
			}
		}
	}
	
	private void getAyuda()
	{
		ayuda= "<sec>"+
		"<tit>Indice</tit>"+
		"<con>"+
		"<sec>"+
			"<tit>Fusionar dos textos</tit>"+
			"<con>"+
			"Para fusionar dos textos, estos deben ser cargados en “texto 1” y “texto 2” sucesivamente en la ventana principal."+ 
			"Una ves hecho esto, se puede optar por <ira><vin>Comparar por palabras</vin> <eti>comparar por palabras</eti></ira> o"+ 
			"<ira><vin>Comparar por renglones</vin> <eti>comparar por renglones</eti></ira> dichos textos."+
			"Otra opción disponible es la de elegir los <ira><vin>Separadores</vin><eti>separadores</eti></ira> a utilizar para dividir los renglones o separar las palabras. Por defecto están asignados el enter y el espacio."+
			"</con>"+
		"</sec>"+
		"<sec>"+
			"<tit>Comparar por palabras</tit>"+
			"<con>"+
			"Para hacer esto se debe ir al menu Opciones y marcar la casilla comparar por palabras. Una vez hecho este debe irse al menu Archivo<ira><vin>Fusionar dos textos</vin><eti>Fusionar</eti></ira>."+	
			"</con>"+
		"</sec>"+
		"<sec>"+
			"<tit>Comparar por renglones</tit>"+
			"<con>"+
				"Para hacer esto se debe ir al menu Opciones y desmarcar la casilla “comparar por palabras”. Una vez hecho este debe irse al menu Archivo <ira><vin>Fusionar dos textos</vin><eti>Fusionar</eti></ira>."+
			"</con>"+
		"</sec>"+
		"<sec>"+
			"<tit>Separadores</tit>"+
			"<con>"+
				"Para acceder a los separadores basta con ir al menu Opciones Fusionar Separadores y luego escribir el separador deseado y hacer click en los botones Agregar o Quitar."+	
			"</con>"+
		"</sec>"+
		"<sec>"+
			"<tit>Renderizar texto</tit>"+
			"<con>"+
				"Para renderizar un texto, basta con introducirlo en el “texto 1” de la ventana principal y luego elegir si se desea renderizarlo en formato Wiki o en formato numerado. Una ves hecho esto debe seleccionarse Archivo Renderizar"+	
			"</con>"+
		"</sec>"+
		"<sec>"+
			"<tit>Formato Wiki</tit>"+
			"<con>"+
				"Para renderizar un texto en formato Wiki hay que ir a Opciones Renderizar Formato Wiki"+
			"</con>"+
		"</sec>"+
		"<sec>"+
			"<tit>Formato numerado</tit>"+
			"<con>"+
				"Para renderizar un texto en formato Wiki hay que ir a Opciones Renderizar Formato Numerado"+
			"</con>"+
		"</sec>"+
		"<sec>"+
			"<tit>Red semantica</tit>"+
			"<con>"+
				"Para constuir una red semantica debe introducirse el documento en “texto 1” de la pantalla principal y luego ir a Archivo Red semantica."+ 
				"Dentro de la ventana que aparecera existen opciones para <ira><vin>Navegar</vin><eti>navegar</eti></ira> el texto, <ira><vin>graficar</vin><eti>Graficar</eti></ira> el grafo generado u otras <ira><vin>Opciones</vin><eti>opciones</eti></ira>."+
			"</con>"+
		"</sec>"+
		"<sec>"+
			"<tit>Navegar</tit>"+
			"<con>"+
				"Permite navegar la <ira><vin>Red semantica</vin><eti>red semantica</eti></ira> como si fuera una pagina web. Para acceder a esta opción, basta con ir a Opciones Navegar"+
			"</con>"+
		"</sec>"+
		"<sec>"+
			"<tit>Graficar</tit>"+
			"<con>"+
				"Genera un grafo a partir de la <ira><vin>Red semantica</vin><eti>red semantica</eti></ira> dada. Para acceder a esta opción, basta con ir a Opciones Graficar"+
			"</con>"+
		"</sec>"+
		"<sec>"+
			"<tit>Opciones</tit>"+
			"<con>"+
				"En esta ventana se encuentran menús para encontrar el camino más corto entre dos nodos, buscar un nodo terminal o verificar si un nodo es sumidero."+
			"</con>"+
		"</sec>"+
		"</con>"+
	"</sec>";
	}
	
	private void colorearTexto()
	{
//		creamos la clase StyleContext en la que nos apoyaremos
		StyleContext sc = new StyleContext();

//		primer tipo de estilo... color rojo
		Style estiloAzul = sc.addStyle(null, null);
		StyleConstants.setForeground(estiloAzul, Color.BLUE);
		StyleConstants.setUnderline(estiloAzul, true);
//		tambien existen los método setBackground(), setFont()

//		para el negro
		Style estiloNegro = sc.addStyle(null, null);
		StyleConstants.setForeground(estiloNegro, Color.black);
		
//		creamos el StyledDocument pasandole la clase
//		StyleContext que hemos creado antes...
		DefaultStyledDocument doc = new DefaultStyledDocument(sc);
		
		JTextPane texto1 = new JTextPane(doc); 
		texto1.setFont(new Font("Dialog", Font.BOLD, 12));
		texto1.setToolTipText("precione ESC para cerrar");
		texto1.addKeyListener(this);
		texto1.addMouseListener(this);
		this.jTextPane=texto1;
		this.vinculos=new Vector<Vinculo>();
		try {
			for(int i=0;i<datos.size();i++)
			{
				if(datos.elementAt(i) instanceof String)
				{
					doc.insertString(doc.getLength(), (String)datos.elementAt(i), estiloNegro);
				}
				else
				{
					Vinculo v=new Vinculo();
					v.setVinculo(((NodoVinculo)datos.elementAt(i)).getVinculo().trim());
					v.setInicio(jTextPane.getText().length());
					v.setFin(jTextPane.getText().length()+((NodoVinculo)datos.elementAt(i)).getEtiqueta().length());
					this.vinculos.addElement(v);
					doc.insertString(doc.getLength(), ((NodoVinculo)datos.elementAt(i)).getEtiqueta(), estiloAzul);
				}
			}
		} catch (BadLocationException e) {
			e.printStackTrace();
		} 
	}

	@Override
	public void keyPressed(KeyEvent arg0) {
	}

	@Override
	public void keyReleased(KeyEvent arg0) {
	}

	@Override
	public void keyTyped(KeyEvent arg0) {
	}

	@SuppressWarnings("unchecked")
	@Override
	public void mouseClicked(MouseEvent arg0) {
		if(arg0.getComponent()==this.getJTextPane())
		{
			int posicion=this.getJTextPane().getCaretPosition();
			for (int i=0;i<vinculos.size();i++)
			{
				if(posicion>=vinculos.elementAt(i).getInicio() && posicion<=vinculos.elementAt(i).getFin())
				{
					DocumentoJerarquicoEnlazado dJE1;
					try {
						dJE1 = new DocumentoJerarquicoEnlazado(ayuda);
						datos= dJE1.getSeccion(vinculos.elementAt(i).getVinculo());
						
						this.seleccionado.addElement(vinculos.elementAt(i).getVinculo());
						this.getJButton1().setEnabled(true);
						this.getJButton().setEnabled(false);
						this.posicion=seleccionado.size();
						
						this.jTabbedPane=null;
						this.jPanel1=null;
						this.jScrollPane=null;
						this.jTextPane=null;
						
						this.inicializar(vinculos.elementAt(i).getVinculo());
						
						this.setContentPane(getJTabbedPane());
						this.getJTextPane().setEditable(false);
						
					} catch (ContenidoException e) {
						JOptionPane.showMessageDialog(this, "Texto con errores de sintaxis", "Atencion!", 2);
					} catch (DataStructureException e) {
						JOptionPane.showMessageDialog(this, "Texto con errores de sintaxis", "Atencion!", 2);
					}
				}
			}
		}
	}

	@Override
	public void mouseEntered(MouseEvent arg0) {
	}

	@Override
	public void mouseExited(MouseEvent arg0) {
	}

	@Override
	public void mousePressed(MouseEvent arg0) {	
	}

	@Override
	public void mouseReleased(MouseEvent arg0) {
	}
	
	@SuppressWarnings("unchecked")
	private void inicializar(String inicio)
	{
		DocumentoJerarquicoEnlazado dJE1;
		try {
			dJE1 = new DocumentoJerarquicoEnlazado(ayuda);
			datos= dJE1.getSeccion(inicio);
			
			this.colorearTexto();
			
		} catch (ContenidoException e) {
			JOptionPane.showMessageDialog(this, "Texto con errores de sintaxis", "Atencion!", 2);
		} catch (DataStructureException e) {
			JOptionPane.showMessageDialog(this, "Texto con errores de sintaxis", "Atencion!", 2);
		}
	}
	
}  //  @jve:decl-index=0:visual-constraint="10,10"
